package com.data.security;

import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.util.UUID;

import com.data.security.control.ArchivoTransBD;
import com.data.security.control.Ventana;
import com.data.security.modelo.Archivo;
import com.data.security.rodrigo.Encripta;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;

public class DesencriptarActivity extends Activity {

	private String archivo_seleccionado;
	private Archivo archivo;
	private TextView ruta;
	private ArchivoTransBD archivador;
	private ProgressDialog dialogo;
	public static Handler finaliza;
	private Context contexto;
	private Encripta encripta;

	protected void onCreate(Bundle saved) {
		super.onCreate(saved);

		setContentView(R.layout.activity_desencriptar);
		contexto = getApplicationContext();
		encripta=Encripta.getEncripta();
		cargarViews();
		archivador = new ArchivoTransBD(getApplicationContext());
		archivo = new Archivo();

		finaliza = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				terminarDialogo();
				int valor = (Integer) msg.obj;
				if (valor == -1) {
					mostrar(getString(R.string.errorproceso));
				} else if (valor == -2) {
					mostrar(getString(R.string.errordesencripta));
				}
			}
		};

	}

	public void explorador(View view) {
		Intent inten = new Intent(getApplicationContext(),
				ExploradorActivity.class);
		inten.putExtra("bandera", 1);
		inten.putExtra("titulo", getString(R.string.encriptados));
		startActivityForResult(inten, 555);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK && requestCode == 555) {
			if (data.hasExtra("archivo_seleccionado")) {
				archivo_seleccionado = data.getExtras().getString(
						"archivo_seleccionado");
				if (archivo_seleccionado != null) {
					ruta.setText(archivo_seleccionado);
				}
			}

		}
	}

	public void desencriptarArchivo(View view) {

		try {
			File ff = new File(archivo_seleccionado);
			archivo.setUUID(UUID.randomUUID().toString());
			archivo.setRuta(archivo_seleccionado);
			archivo.setTamanio(ff.length());
			archivo.setTitulo(Archivo.extraerTitulo(archivo_seleccionado));
			archivo.setTipo(Archivo.extraerExtension(archivo_seleccionado));

		} catch (Exception e) {

			e.printStackTrace();
		}

		dialogo = new ProgressDialog(this);
		dialogo.setTitle("");
		dialogo.setMessage(getString(R.string.labeldesencripta));

		archivador.setArchivo(archivo);
		String uuid = archivador.getUUIDArchivo();
		if (!uuid.equals("")) {
			
			archivo.setUUID(uuid);
			dialogo.show();
			procesoDesencriptar();
			archivador.setArchivo(archivo);
			archivador.delete();

		} else {
			
			dialogo.show();
			procesoDesencriptar();

		}

	}

	private void terminarDialogo() {
		runOnUiThread(new Runnable() {

			@Override
			public void run() {
				dialogo.cancel();
				dialogo.dismiss();
			}

		});

	}

	private void mostrar(final String mss) {
		runOnUiThread(new Runnable() {

			@Override
			public void run() {
				dialogo.cancel();

				new Ventana(DesencriptarActivity.this,
						getString(R.string.labelescribiendo), mss);

			}
		});

	}

	private void procesoDesencriptar() {
		new Thread(new Runnable() {
			int resultado = 0;

			@Override
			public void run() {
				archivo.setData(ByteBuffer.allocate((int) archivo.getTamanio())
						.array());
				try {

					FileInputStream entrada = new FileInputStream(new File(
							archivo.getRuta()));

					entrada.read(archivo.getData(), 0, archivo.getData().length);

					entrada.close();

					resultado = 5;

				} catch (Exception e) {
					resultado = -1;
					e.printStackTrace();
				}

				boolean respu = encripta.descifrar(archivo, contexto);

				if (archivo.getData().length <= 0 || !respu) {
					if (resultado != -1) {
						resultado = -2;
					}
				}

				archivo.escribirEnLocal(Archivo.rutaDesencriptado);
				Message msg = new Message();
				msg.obj = resultado;
				DesencriptarActivity.finaliza.sendMessage(msg);

			}

		}) {
		}.start();
	}

	private void cargarViews() {
		ruta = (TextView) findViewById(R.id.campo_ruta_archivo);
	/*	recordatorio=(TextView)findViewById(R.id.label_recordatorio);
		recordatorio.setText(getString(R.string.recordatorio)+": "+Archivo.rutaDesencriptado);
*/
	}

}
